package com.learn;

/**
 * 类加载执行顺序:
 * 1.静态属性，静态方法声明，静态块。
 * <p>
 * 2.动态属性，普通方法声明，构造块。
 * <p>
 * 3.构造方法。
 * <p>
 * 当new一个对象时，此时会调用构造方法，但是在调用构造方法之前，（除非被打断而暂停）执行动态属性定义并设置默认值（一举生成的）。
 *
 * @author: MI
 * @email: 448341911@qq.com
 * @createTime: 2024/8/17 17:15
 * @updateUser: MI
 * @updateTime: 2024/8/17 17:15
 * @updateRemark: 修改内容
 * @version: v1.0
 */
public class Text {


    //类加载jvm先对属性赋默认值 根据数据类型
    public static int k = 0; // 1.静态属性
    //2.静态属性 new对象暂停了类加载过程去执行构造方法，但在之前先执行动态属性定义并设置默认值 ,
    // 然后动态属性初始化，分配内存，构造块，普通方法声明（只是加载，它不需要初始化，只有调用它时才分配内存，
    // 当方法执行完毕后内存立即释放），没有优先级之分，按出现顺序执行。
    public static Text t1 = new Text("t1");
    public static Text t2 = new Text("t2");  //重复上述操作
    public static int i = print("i"); //静态属性
    public static int n = 99; //静态属性  至此静态方法执行完毕  开始执行静态块
    public int j = print("j");

    {
        print("构造块");//构造块
    }

    static {
        print("静态块");//静态块 静态块执行完之后 执行main方法  (main方法也属于特殊静态方法)
    }

    public Text(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++i;
        ++n;
    }

    public static int print(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String args[]) {
        Text t = new Text("init");//main方法开始之后  开始执行动态属性  及代码块
    }
}
